﻿using Microsoft.VisualStudio.TestTools.UnitTesting;
using FitnessTracker.Packet;

namespace FitnessTrackerCoreUnitTests
{
    [TestClass]
    public class PacketStructureValidationTests
    {
        #region ValidPacket

        readonly byte[] packetWithValidStructure = new byte[]
                            {
                                0x02,  //STX
                                0x26,  //MessageID
                                0x37,  //DLC
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x03  //ETX
                            };
        #endregion

        #region Packet With 59 Bytes
        readonly byte[] packetWith59Bytes = new byte[]
                            {
                                0x02,  //STX
                                0x26,  //MessageID
                                0x37,  //DLC
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,

                                0x03  //ETX
                            };
        #endregion

        #region Packet with Invalid STX

        readonly byte[] packetWithInvalidSTX = new byte[]
                            {
                                0x01,  //STX should be 0x02 
                                0x26,  //MessageID
                                0x37,  //DLC
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x03  //ETX
                            };
        #endregion

        #region Packet with Invalid Message ID

        readonly byte[] packetWithInValidMessageID = new byte[]
                            {
                                0x02,  //STX
                                0x27,  //MessageID should be 0x26
                                0x37,  //DLC
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x03  //ETX
                            };
        #endregion

        #region Packet with Invalid DLC

        readonly byte[] packetWithInvalidDLC = new byte[]
                            {
                                0x02,  //STX
                                0x26,  //MessageID
                                0x38,  //DLC should be 0x37
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x03  //ETX
                            };
        #endregion

        #region Packet with Invalid ETX

        readonly byte[] packetWithInvalidETX = new byte[]
                            {
                                0x02,  //STX
                                0x26,  //MessageID
                                0x37,  //DLC
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x20,
                                0x04  //ETX should be 0x03
                            };
        #endregion

        [TestMethod]
        public void PacketStructureValidation()
        {
            Assert.IsTrue(HxMPacketStructureValidator.IsStructureValid(packetWithValidStructure));
            Assert.IsFalse(HxMPacketStructureValidator.IsStructureValid(packetWith59Bytes));
            Assert.IsFalse(HxMPacketStructureValidator.IsStructureValid(packetWithInvalidSTX));
            Assert.IsFalse(HxMPacketStructureValidator.IsStructureValid(packetWithInValidMessageID));
            Assert.IsFalse(HxMPacketStructureValidator.IsStructureValid(packetWithInvalidDLC));
            Assert.IsFalse(HxMPacketStructureValidator.IsStructureValid(packetWithInvalidETX));
        }
    }
}
